Option Explicit

Public Sub SummeBereich_Dynamisch()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim rng As Range
    Dim summe As Double
    Dim ignoriert As Long
    
    '--------------------------------------------
    ' Arbeitsblatt wählen (eine Variante aktivieren)
    '--------------------------------------------
    
    ' Variante 1: Aktives Blatt (einfach, aber weniger robust)
    'Set ws = ActiveSheet
    
    ' Variante 2: Aktives Blatt, aber garantiert in der Mappe mit dem Code
    'Set ws = ThisWorkbook.ActiveSheet
    
    ' Variante 3: Fester Blattname (robust, aber Name muss exakt passen)
    'Set ws = ThisWorkbook.Worksheets("Tabelle1")
    
    ' Variante 4: Codename (sehr robust, unabhängig vom Tab-Namen)
    ' -> Im VBA-Editor links z.B. "Tabelle1 (Tabelle1)" -> Tabelle1 ist der Codename
    Set ws = Tabelle1
    
    '--------------------------------------------
    ' Sicherheitscheck: Spalte A komplett leer?
    '--------------------------------------------
    If Application.WorksheetFunction.CountA(ws.Columns("A")) = 0 Then
        MsgBox "In Spalte A sind keine Werte vorhanden.", vbExclamation, "Abbruch"
        Exit Sub
    End If
    
    ' Letzte gefüllte Zeile in Spalte A finden
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    Set rng = ws.Range("A1:A" & lastRow)
    
    ' Alte Markierungen entfernen (optional, aber hilfreich)
    rng.Interior.Pattern = xlNone
    
    ' Rechnen
    summe = SummeAusBereich_Sicher(rng, ignoriert, True)
    
    ' Ergebnis ausgeben
    ws.Range("B1").Value = summe
    
    If ignoriert > 0 Then
        MsgBox ignoriert & " Zelle(n) wurden ignoriert (keine Zahl) und markiert.", vbInformation, "Hinweis"
    End If
End Sub


Private Function SummeAusBereich_Sicher(ByVal rng As Range, ByRef ignoriert As Long, ByVal markieren As Boolean) As Double
    Dim c As Range
    Dim summe As Double
    
    summe = 0
    ignoriert = 0
    
    For Each c In rng.Cells
        If IsEmpty(c.Value) Then
            ' leer -> nichts tun
        ElseIf IsNumeric(c.Value) Then
            summe = summe + CDbl(c.Value)
        Else
            ignoriert = ignoriert + 1
            
            If markieren Then
                c.Interior.Color = vbYellow
            End If
        End If
    Next c
    
    SummeAusBereich_Sicher = summe
End Function

